﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;

namespace JoyeriaProject
{
    class ModeloDatos
    {
        private DatabaseManager DBManager = new DatabaseManager();
        private IFormatProvider culture = new CultureInfo("en-US", true);

        private List<Agentes> Agents = new List<Agentes>();
        private List<Clientes> Clients = new List<Clientes>();
        private List<ComprasPagos> PaymentShoppings = new List<ComprasPagos>();
        private List<Totales> Totales = new List<Totales>();
        private List<TempCustomerData> TempCustomerDataList;

        public Agentes Agent;
        public Clientes Client;
        public ComprasPagos PaymentShopping;
        public enum SQLStyle{Update=0, Select=1 , Insert=2};

        private class TempCustomerData
        {
            public int DiaCobro { get; set; }
            public int TipoAbono { get; set; }
            public double MontoAbono { get; set; }
            public DateTime Fecha { get; set; }
            public double Cargo { get; set; }
            public double Abono { get; set; }
            public double Saldo { get; set; }
        }

        public ModeloDatos(int LOAD = 2)
        {//LOAD: 0 = Agentes, 1 = Customer, 2 = TODO

            if (LOAD == 2)
            {
                LoadModel();

                foreach (int element in Clients.Select(n => n.CustomerID).Distinct().ToList())
                    LoadCustomerHistory(element);
            }
            else if(LOAD == 1)
                LoadCustomers();
            else if (LOAD == 0)
                LoadAgents();

        }

        private void LoadCustomerHistory(int IDCustomer)
        {
          var CompleteCustomerData = (from C in Clients
                                      join P in PaymentShoppings
                                      on C.CustomerID equals P.CustomerID
                                      where (C.CustomerID == IDCustomer)
                                      orderby P.Date
                                      select new
                                      {
                                        CustomerID = C.CustomerID,
                                        DiaCobro = C.DiaCobro,
                                        TipoAbono = C.TipoAbono,
                                        MontoAbono = C.MontoAbono,
                                        Fecha = P.Date,
                                        Cargo = P.Cargo,
                                        Abono = P.Abono,
                                        Saldo = P.Saldo
                                        }).ToList();

          if (CompleteCustomerData.Count > 0)
          {
              DateTime FechaPagoInicial = CompleteCustomerData.Min(n => n.Fecha);
              DateTime FechaPagoFinal = CompleteCustomerData.Min(n => n.Fecha);

              while (FechaPagoFinal.Date.DayOfWeek != (DayOfWeek)CompleteCustomerData.Min(n => n.DiaCobro))
                  FechaPagoFinal = FechaPagoFinal.AddDays(1);

              FechaPagoFinal = FechaPagoFinal.AddDays(CompleteCustomerData.Min(n => n.TipoAbono));


              while (DateTime.Compare(FechaPagoInicial, DateTime.Now) <= 0)
              {
                  TempCustomerDataList = (from n in CompleteCustomerData
                                          where n.Fecha <= FechaPagoFinal && n.Fecha >= FechaPagoInicial
                                          select new TempCustomerData
                                          {
                                              DiaCobro = n.DiaCobro,
                                              TipoAbono = Convert.ToInt32(n.TipoAbono),
                                              MontoAbono = n.MontoAbono,
                                              Fecha = n.Fecha,
                                              Cargo = n.Cargo,
                                              Abono = n.Abono,
                                              Saldo = n.Saldo
                                          }).ToList();

                  AgregarPeriodoTotal(IDCustomer, TempCustomerDataList, FechaPagoFinal);

                  FechaPagoInicial = FechaPagoFinal.AddDays(1);
                  FechaPagoFinal = FechaPagoFinal.AddDays(CompleteCustomerData.Min(n => n.TipoAbono));
              }
          }
        }

        private void AgregarPeriodoTotal(int CustomerID, List<TempCustomerData> CustomerRawDataList, DateTime Fecha)
        {
            Totales Total = new Totales();

            Total.CustomerID = Convert.ToInt32(CustomerID);
            Total.Fecha = Fecha;
            Total.DiasParaPagar = AgregarPeriodoSubTotal(CustomerRawDataList);

            Total.Cargo = Total.DiasParaPagar.Sum(n => n.Cargo);
            Total.Abono = Total.DiasParaPagar.Sum(n => n.Abono);

            Total.Saldo = Total.Cargo - Total.Abono;

            Total.metaCumplida = (Total.Abono == 0 ? false : (Total.Abono >= CustomerRawDataList.Min(n => n.MontoAbono)));

            this.Totales.Add(Total);
        }

        private List<Subtotales> AgregarPeriodoSubTotal(List<TempCustomerData> CustomerRawDataLists)
        {
            List<Subtotales> subtotales = new List<Subtotales>();
            var CustomerRawDataList = CustomerRawDataLists;

            foreach(var element in CustomerRawDataList)
            {
                Subtotales subtotal = new Subtotales();

                subtotal.Cargo = element.Cargo;
                subtotal.Abono = element.Abono;
                subtotal.Fecha = element.Fecha;
                subtotales.Add(subtotal);
            }
            return subtotales;
        }

        public Agentes NewAgent()
        {
            return new Agentes();
        }

        public Clientes NewClient()
        {
            return new Clientes();
        }

        public ComprasPagos NewPaymentShopping()
        {
            return new ComprasPagos();
        }
      
        public int VerificarStatus(int CustID)
        {
            // 0 Bueno , 1 Malo , se pueden agregar mas status como regular
            try
            { 

                return GetMalosClientes().Single(n => n == CustID);

            }
            catch (Exception Ex)
            {
                return 0;
            }

        }

        public List<int> GetBuenosClientes()
        {
            const int BUENOS_CLIENTES = 2; //Tolerancia de ciclos no pagados (Default es 2 seria como estar al dia)
            List<int> CustomerList = new List<int>();

            var Counts = from c in Totales
                         group c by c.CustomerID into g
                         select new { CustomerID = g.Key, counts = g.Count() };

            foreach (var CustomerInfo in Counts)
            {
                var tt = from n in Totales
                         where (n.Abono > 0) && (n.CustomerID == CustomerInfo.CustomerID)
                         group n by n.CustomerID into CustID
                         select new { CustomerID = CustID.Key, counts = CustID.Count() };
                try
                {
                    if (CustomerInfo.counts - BUENOS_CLIENTES <= (tt.Max(n => n.counts)))
                        CustomerList.Add(CustomerInfo.CustomerID);
                }
                catch (Exception ex)
                { }
            }

            return CustomerList;
        }

        public List<int> GetTodosClientes()
        {
            List<int> CustomerList = new List<int>();

            foreach(int CustomerID in Clients.Select(n => n.CustomerID))
                CustomerList.Add(CustomerID);

            return CustomerList;
        }

        public List<int> GetMalosClientes()
        {
            const int MALOS_CLIENTES = 3;//Tolerancia de ciclos no pagados (Default es 3 seria osea que debe un ciclo de pago x)
            List<int> CustomerList = new List<int>();

            var Counts = from c in Totales
                         group c by c.CustomerID into g
                         select new { CustomerID = g.Key, counts = g.Count() };

            foreach (var CustomerInfo in Counts.Where(n => n.counts > 1))
            {
                    var tt = from n in Totales
                             where (n.Abono > 0) && (n.CustomerID == CustomerInfo.CustomerID)
                             group n by n.CustomerID into CustID
                             select new { CustomerID = CustID.Key, counts = CustID.Count() };

                    try
                    {
                        if (tt.Count() == 0 ? true : CustomerInfo.counts - (tt.Max(n => n.counts)) > MALOS_CLIENTES)
                            CustomerList.Add(CustomerInfo.CustomerID);
                    }
                    catch (Exception ex)
                    { }
                
            }

            return CustomerList;
        }

        public double GetSaldoCliente(int CustID)
        {
            return ((PaymentShoppings.Where(n => n.CustomerID == CustID).Sum(n => n.Cargo)) - (PaymentShoppings.Where(n => n.CustomerID == CustID).Sum(n => n.Abono)));
        }

        public DateTime GetFechaUltimoPagoCliente(int CustID)
        {
            return PaymentShoppings.Where(n => n.CustomerID == CustID && n.Cargo == 0).Max(n => n.Date);  
        }

        public object CustomSQLTest(CustomSQL CSQL)
        {
            if (CSQL.Update)
            {
                if(DBManager.UpdateToDB(CSQL.testUpdate(), CSQL.Columns))
                {
                    if (CSQL.Table.ToUpper() == "PAYMENTS")
                    {
                        ComprasPagos CP = PaymentShoppings.Find(n => n.ID == CSQL.KeyValue.ToString());
                        PaymentShopping = new ComprasPagos();

                        foreach (SimpleDatabaseValues element in CSQL.Columns)
                        {
                            PaymentShopping.ID = (element.parameter == "ID" ? element.value.ToString() : CP.ID);
                            PaymentShopping.CustomerID = (element.parameter == "CustomerID" ? Convert.ToInt32(element.value) : CP.CustomerID);
                            PaymentShopping.Cargo = (element.parameter == "Cargo" ? Convert.ToDouble(element.value) : CP.Cargo);
                            PaymentShopping.Abono = (element.parameter == "Abono" ? Convert.ToDouble(element.value) : CP.Abono);
                            PaymentShopping.Date = (element.parameter == "Fecha" ? DateTime.ParseExact(element.value.ToString(), "MMddyyyy", culture) : CP.Date);
                            PaymentShopping.Fecha = (element.parameter == "Fecha" ? element.value.ToString() : CP.Fecha);
                            PaymentShopping.Saldo = (element.parameter == "Saldo" ? Convert.ToDouble(element.value) : CP.Saldo);
                            PaymentShopping.Firma = (element.parameter == "Articulo" ? element.value.ToString() : CP.Articulo);
                            PaymentShopping.Firma = (element.parameter == "Firma" ? element.value.ToString() : CP.Firma);
                        }
                        PaymentShoppings.Remove(PaymentShoppings.Find(n => n.ID == CSQL.KeyValue.ToString()));
                         PaymentShoppings.Add(PaymentShopping);
                    }
                    if (CSQL.Table.ToUpper() == "CUSTOMER")
                    {

                        Clientes CL = Clients.Find(n => n.CustomerID == Convert.ToInt32(CSQL.KeyValue));
                        Client = new Clientes();

                        foreach (SimpleDatabaseValues element in CSQL.Columns)
                        {
                            Client.CustomerID = (element.parameter == "CustomerID" ? Convert.ToInt32(element.value) : CL.CustomerID);
                            Client.Fecha = (element.parameter == "Fecha" ? element.value.ToString() : CL.Fecha);
                            Client.Nombre = (element.parameter == "Nombre" ? element.value.ToString() : CL.Nombre);
                            Client.Apellidos = (element.parameter == "Apellidos" ? element.value.ToString() : CL.Apellidos);
                            Client.TipoCasa = (element.parameter == "TipoCasa" ? element.value.ToString() : CL.TipoCasa);
                            Client.Direccion = (element.parameter == "Direccion" ? element.value.ToString() : CL.Direccion);
                            Client.DetalleDireccion = (element.parameter == "DetalleDireccion" ? element.value.ToString() : CL.DetalleDireccion);
                            Client.Colonia = (element.parameter == "Colonia" ? element.value.ToString() : CL.Colonia);
                            Client.Telefono = (element.parameter == "Telefono" ? element.value.ToString() : CL.Telefono);
                            Client.Celular = (element.parameter == "Celular" ? element.value.ToString() : CL.Celular);
                            Client.TipoAbono = (element.parameter == "TipoAbono" ? Convert.ToDouble(element.value)  : CL.TipoAbono);
                            Client.MontoAbono = (element.parameter == "MontoAbono" ? Convert.ToDouble(element.value) : CL.MontoAbono);
                            Client.Referencia = (element.parameter == "Referencia" ? element.value.ToString() : CL.Referencia);
                            Client.Compania = (element.parameter == "Compania" ? element.value.ToString() : CL.Compania);
                            Client.Puesto = (element.parameter == "Puesto" ? element.value.ToString() : CL.Puesto);
                            Client.DirCompania = (element.parameter == "DirCompania" ? element.value.ToString() : CL.DirCompania);
                            Client.DirColoniaCompania = (element.parameter == "DirColoniaCompania" ? element.value.ToString() : CL.DirColoniaCompania);
                            Client.DirDetalleCompania = (element.parameter == "DirDetalleCompania" ? element.value.ToString() : CL.DirDetalleCompania);
                            Client.TelCompania = (element.parameter == "TelCompania" ? element.value.ToString() : CL.TelCompania);
                            Client.Agente = (element.parameter == "Agente" ? element.value.ToString() : CL.Agente);
                            Client.DiaCobro = (element.parameter == "DiaCobro" ? Convert.ToInt32(element.value) : CL.DiaCobro);
                            Client.Articulos = (element.parameter == "Articulos" ? element.value.ToString() : CL.Articulos);
                        }

                        Clients.Remove(Clients.Find(n => n.CustomerID == Convert.ToInt32(CSQL.KeyValue)));
                        Clients.Add(CL);
                    }
                    if (CSQL.Table.ToUpper() == "AGENTS")
                    {
                        Agentes AG = Agents.Find(n => n.ID == CSQL.KeyValue.ToString());
                        Agent = new Agentes();

                        foreach (SimpleDatabaseValues element in CSQL.Columns)
                        {
                            Agent.ID = (element.parameter == "ID" ? element.value.ToString() : AG.ID);
                            Agent.Nombre = (element.parameter == "Nombre" ? element.value.ToString() : AG.Nombre);
                            Agent.Apellidos = (element.parameter == "Apellidos" ? element.value.ToString() : AG.Apellidos); ;
                            Agent.Telefono = (element.parameter == "Telefono" ? element.value.ToString() : AG.Telefono); ;
                        }

                         Agents.Remove(Agents.Find(n => n.ID == CSQL.KeyValue.ToString()));
                         Agents.Add(Agent);
                    }
                    
                    return true;
                }
                return false;
            }
            if (CSQL.Select)
             return DBManager.ReadFromDB(CSQL.testUpdate());
            
            return false;
        }

        private void LoadAgents()
        {

            ///////////////////////////////////////////AGENTS////////////////////////////////////////////////////////////

            string[] agentes = DBManager.ReadFromDB("Select ID, Nombre, Apellidos, Telefono From AGENTS");

            foreach (string element in agentes)
            {
                string[] agente = element.Split('~');

                Agents.Add
                    (
                        new Agentes
                        {
                            ID = agente[0],
                            Nombre = agente[1],
                            Apellidos = agente[2],
                            Telefono = agente[3],
                        }
                     );

            }
        }

        private void LoadCustomers()
        {

            /////////////////////////////////////////CUSTOMERS//////////////////////////////////////////////////////////////

            string[] clientes = DBManager.ReadFromDB("Select CustomerID, Fecha, Nombre, Apellidos, TipoCasa, Direccion, DetalleDireccion, Colonia, Telefono, Celular, TipoAbono, MontoAbono, Referencia, Compania, Puesto, DirCompania, DirColoniaCompania, DirDetalleCompania, TelCompania, Agente, DiaCobro, Articulos, Ruta From Customer");

            foreach (string element in clientes)
            {
                string[] cliente = element.Split('~');

                Clients.Add
                    (
                        new Clientes
                        {
                            CustomerID = Convert.ToInt32(cliente[0]),
                            Fecha = cliente[1],
                            Nombre = cliente[2],
                            Apellidos = cliente[3],
                            TipoCasa = cliente[4],
                            Direccion = cliente[5],
                            DetalleDireccion = cliente[6],
                            Colonia = cliente[7],
                            Telefono = cliente[8],
                            Celular = cliente[9],
                            TipoAbono = Convert.ToDouble(cliente[10]),
                            MontoAbono = Convert.ToDouble(cliente[11]),
                            Referencia = cliente[12],
                            Compania = cliente[13],
                            Puesto = cliente[14],
                            DirCompania = cliente[15],
                            DirColoniaCompania = cliente[16],
                            DirDetalleCompania = cliente[17],
                            TelCompania = cliente[18],
                            Agente = cliente[19],
                            DiaCobro = Convert.ToInt32(cliente[20]),
                            Articulos = cliente[21],
                            Ruta = cliente[22]
                        }
                     );
            }
        }

        private void LoadTransactions()
        {
            ///////////////////////////////////////COMPRAS PAGOS////////////////////////////////////////////////////////////////
            string[] compraspagos = DBManager.ReadFromDB("Select ID , CustomerID, Fecha, Cargo , Abono , Saldo , Articulo, Firma From Payments");

            foreach (string element in compraspagos)
            {
                string[] comprapago = element.Split('~');

                PaymentShoppings.Add
                    (
                        new ComprasPagos
                        {
                            ID = comprapago[0],
                            CustomerID = Convert.ToInt32(comprapago[1]),
                            Fecha = comprapago[2],
                            Date = DateTime.ParseExact(comprapago[2], "MMddyyyy", culture),
                            Cargo = Convert.ToDouble(comprapago[3]),
                            Abono = Convert.ToDouble(comprapago[4]),
                            Saldo = Convert.ToDouble(comprapago[5]),
                            Articulo = comprapago[6],
                            Firma = comprapago[7]

                        }
                    );
            }
        }

        private void LoadModel()
        {
            //Reads from DB
           LoadAgents();
           LoadCustomers();
           LoadTransactions();
        }

        private List<SimpleDatabaseValues> AddAgents(Agentes AG)
        {
            List<SimpleDatabaseValues> Values = new List<SimpleDatabaseValues>();

            Values.Add(DBManager.AddValues("ID", AG.ID));
            Values.Add(DBManager.AddValues("Nombre", AG.Nombre));
            Values.Add(DBManager.AddValues("Apellidos", AG.Apellidos));
            Values.Add(DBManager.AddValues("Telefono", AG.Telefono));

            return Values;
        }
        
        private List<SimpleDatabaseValues> AddClients(Clientes CL)
        {
            List<SimpleDatabaseValues> Values = new List<SimpleDatabaseValues>();

            Values.Add(DBManager.AddValues("CustomerID", CL.CustomerID));
            Values.Add(DBManager.AddValues("Fecha", CL.Fecha));
            Values.Add(DBManager.AddValues("Nombre", CL.Nombre));
            Values.Add(DBManager.AddValues("Apellidos", CL.Apellidos));
            Values.Add(DBManager.AddValues("TipoCasa", CL.TipoCasa));
            Values.Add(DBManager.AddValues("Direccion", CL.Direccion));
            Values.Add(DBManager.AddValues("DetalleDireccion", CL.DetalleDireccion));
            Values.Add(DBManager.AddValues("Colonia", CL.Colonia));
            Values.Add(DBManager.AddValues("Telefono", CL.Telefono));
            Values.Add(DBManager.AddValues("Celular", CL.Celular));
            Values.Add(DBManager.AddValues("DiaCobro", CL.DiaCobro));
            Values.Add(DBManager.AddValues("TipoAbono", CL.TipoAbono));
            Values.Add(DBManager.AddValues("MontoAbono", CL.MontoAbono));
            Values.Add(DBManager.AddValues("Referencia", CL.Referencia));
            Values.Add(DBManager.AddValues("Compania", CL.Compania));
            Values.Add(DBManager.AddValues("Puesto", CL.Puesto));
            Values.Add(DBManager.AddValues("DirCompania", CL.DirCompania));
            Values.Add(DBManager.AddValues("DirColoniaCompania", CL.DirColoniaCompania));
            Values.Add(DBManager.AddValues("DirDetalleCompania", CL.DirDetalleCompania));
            Values.Add(DBManager.AddValues("TelCompania", CL.TelCompania));
            Values.Add(DBManager.AddValues("Agente", CL.Agente));
            Values.Add(DBManager.AddValues("Articulos", CL.Articulos));
            Values.Add(DBManager.AddValues("Ruta", CL.Ruta));
            return Values;
        }
       
        private List<SimpleDatabaseValues> AddPaymentShopping(ComprasPagos CP)
        {
            List<SimpleDatabaseValues> Values = new List<SimpleDatabaseValues>();

            Values.Add(DBManager.AddValues("ID", CP.ID));
            Values.Add(DBManager.AddValues("CustomerID", CP.CustomerID));
            Values.Add(DBManager.AddValues("Fecha", CP.Fecha));
            Values.Add(DBManager.AddValues("Abono", CP.Abono));
            Values.Add(DBManager.AddValues("Cargo", CP.Cargo));
            Values.Add(DBManager.AddValues("Saldo", CP.Saldo));
            Values.Add(DBManager.AddValues("Articulo", CP.Articulo));
            Values.Add(DBManager.AddValues("Firma", CP.Firma));
            Values.Add(DBManager.AddValues("Status", "0")); // Verificar
            Values.Add(DBManager.AddValues("Fechas", CP.Date.ToString("dd/MM/yyyy")));
            
            return Values;
        }

        public bool Add<T>(ref T obj)
        {
            List<SimpleDatabaseValues> Values;

            if (obj.GetType() == typeof(Agentes))
            {
                Agentes AG = (Agentes)(object)obj;

                Values = AddAgents(AG);

                if (DBManager.InsertToDB("Insert Into Agents (ID, Nombre, Apellidos, Telefono) Values (?,?,?,?)", Values))
                {
                    Agents.Add(AG);
                    return true;
                }

            }
            else if (obj.GetType() == typeof(Clientes))
            {
                Clientes CL = (Clientes)(object)obj;

                Values = AddClients(CL);

                if (DBManager.InsertToDB("Insert Into Customer (CustomerID, Fecha, Nombre, Apellidos, TipoCasa, Direccion,DetalleDireccion,Colonia, Telefono, Celular, DiaCobro,TipoAbono, MontoAbono, Referencia, Compania,Puesto, DirCompania,DirColoniaCompania, DirDetalleCompania, TelCompania, Agente,Articulos, Ruta) Values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", Values))
                {
                    Clients.Add(CL);
                    return true;
                }
            }
            else if (obj.GetType() == typeof(ComprasPagos))
            {
                ComprasPagos CP = (ComprasPagos)(object)obj;

                Values = AddPaymentShopping(CP);

                if (DBManager.InsertToDB("Insert Into Payments (ID, CustomerID, Fecha, Abono, Cargo, Saldo, Articulo, Firma, Status, Fechas) Values (?,?,?,?,?,?,?,?,?,?)", Values))
                {
                    PaymentShoppings.Add(CP);
                    return true;
                }
            }

            return false;
        }

        public bool Update<T>(ref T obj)
        {
            List<SimpleDatabaseValues> Values;

            if (obj.GetType() == typeof(Agentes))
            {
                Agentes AG = (Agentes)(object)obj;

                Values = AddAgents(AG);

                if (DBManager.UpdateToDB("Update Agents Set ID=@ID , Nombre=@Nombre, Apellidos=@Apellidos, Telefono=@Telefono WHERE  ID = '" + AG.ID + "'", Values))
                {
                    Agents.Remove(Agents.Find(n => n.ID == AG.ID));
                    Agents.Add(AG);
                    return true;
                }

            }
            else if (obj.GetType() == typeof(Clientes))
            {
                Clientes CL = (Clientes)(object)obj;
                Values = AddClients(CL);

                if (DBManager.UpdateToDB("Update Customer Set CustomerID=@CustomerID, Fecha=@Fecha, Nombre=@Nombre, Apellidos=@Apellidos, TipoCasa=@TipoCasa, Direccion=@Direccion ,DetalleDireccion=@DetalleDireccion,Colonia=@Colonia, Telefono=@Telefono, Celular=@Celular, DiaCobro=@DiaCobro, TipoAbono=@TipoAbono, MontoAbono=@MontoAbono, Referencia=@Referencia, Compania=@Compania, Puesto=@Puesto, DirCompania=@DirCompania, DirColoniaCompania=@DirColoniaCompania, DirDetalleCompania=@DirDetalleCompania, TelCompania=@TelCompania, Agente=@Agente, Articulos=@Articulos, Ruta=@Ruta WHERE CustomerID = " + CL.CustomerID, Values))
                {
                    Clients.Remove(Clients.Find(n => n.CustomerID == CL.CustomerID));
                    Clients.Add(CL);
                    return true;
                }
            }
            else if (obj.GetType() == typeof(ComprasPagos))
            {
                ComprasPagos CP = (ComprasPagos)(object)obj;
                Values = AddPaymentShopping(CP);

                if (DBManager.UpdateToDB("Update Payments Set ID=@ID, CustomerID=@CustomerID, Fechas=@Fechas, Fecha=@Fecha, Cargo=@Cargo, Abono=@Abono, Saldo=@Saldo, Articulo=@Articulo ,Firma=@Firma, Status=@Status WHERE ID = '" + CP.ID + "'", Values))
                {
                    PaymentShoppings.Remove(PaymentShoppings.Find(n => n.ID == CP.ID));
                    PaymentShoppings.Add(CP);
                    return true;
                }
            }
            return false;
        }

        public bool Delete<T>(ref T obj)
        {
            if (obj.GetType() == Agent.GetType())
            {
                Agentes AG = (Agentes)(object)obj;

                if (DBManager.ExecuteToDB("Delete From Agents WHERE  ID = '" + AG.ID + "'"))
                {
                    Agents.Remove(Agents.Find(n => n.ID == AG.ID));
                    return true;
                }

            }
            else if (obj.GetType() == Client.GetType())
            {


            }
            else if (obj.GetType() == PaymentShopping.GetType())
            {

            }
            return false;
        }

        public List<Agentes> GetAgents()
        {
            return Agents;
        }

        public List<Clientes> GetClients()
        {
            return Clients;
        }

        public List<ComprasPagos> GetComprasPagos()
        {
            return PaymentShoppings;
        }

    }
    internal class CustomSQL
    {
        public List<SimpleDatabaseValues> Columns = new List<SimpleDatabaseValues>();
       // public SimpleDatabaseValues Column = new SimpleDatabaseValues();

        public bool Where { get; set; }
        public bool OrderBy { get; set; }
        public bool Select { get; set; }
        public bool Insert { get; set; }
        public bool Update { get; set; }
        public string Table { get; set; }
        public string KeyName { get; set; } //required ..?
        public object KeyValue { get; set; } // the TYPE MINDDDDD
        
        private string sqlString;

        public string testUpdate()
        {
            if (Update)
            {
                sqlString = "Update " + Table + " Set ";
                foreach (var element in Columns)
                {
                    sqlString += element.parameter + "=@" + element.parameter + ",";
                }
                sqlString = sqlString.Remove(sqlString.Length - 1);
            }
            if (Select)
            {
                sqlString = "Select ";
                
                foreach (var element in Columns)
                   sqlString += element.parameter + ",";
                
                sqlString = sqlString.Remove(sqlString.Length - 1);

                sqlString = sqlString + " FROM " + Table;
            }

            if (Where)
                sqlString = sqlString + " Where " + KeyName + " = " + (typeof(string) == KeyValue.GetType() ? "'" + KeyValue + "'" : KeyValue);

            return sqlString;
        }

    }
    internal class Agentes
    {
        public string ID { get; set; }
        public string Nombre { get; set; }
        public string Apellidos { get; set; }
        public string Telefono { get; set; }

    }
    internal class Clientes
    {
        public int CustomerID { get; set; }
        public string Fecha { get; set; }
        public string Nombre { get; set; }
        public string Apellidos { get; set; }
        public string TipoCasa { get; set; }
        public string Telefono { get; set; }
        public string Celular { get; set; }
        public string Direccion { get; set; }
        public string DetalleDireccion { get; set; }
        public string Colonia { get; set; }
        public string Articulos { get; set; }
        public int DiaCobro { get; set; }
        public double TipoAbono { get; set; }
        public double MontoAbono { get; set; }
        public string Referencia { get; set; }
        public string Compania { get; set; }
        public string Puesto { get; set; }
        public string DirCompania { get; set; }
        public string DirDetalleCompania { get; set; }
        public string DirColoniaCompania { get; set; }
        public string TelCompania { get; set; }
        public string Agente { get; set; }
        public string Ruta { get; set; }
    }
    internal class ComprasPagos
    {
        public string ID { get; set; }
        public int CustomerID { get; set; }
        public string Fecha { get; set; }
        public DateTime Date { get; set; }
        public double Cargo { get; set; }
        public double Abono { get; set; }
        public double Saldo { get; set; }
        public string Articulo { get; set; }
        public string Firma { get; set; }
    }
    public class Totales
    {
        public int CustomerID { get; set; }
        public DateTime Fecha { get; set; }//Fecha en la que tiene que hace sus Pagos
        public double Cargo { get; set; }
        public double Abono { get; set; }
        public double Saldo { get; set; }
        public List<Subtotales> DiasParaPagar { get; set; }
        public bool metaCumplida { get; set; }
    }
    public class Subtotales
    {
        public DateTime Fecha { get; set; }//Fecha en que pago o compro
        public double Cargo { get; set; }
        public double Abono { get; set; }
    }
}

 
